{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Subgraph as node action sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "var userHomeDir = System.getProperty(\"user.home\");\n",
    "var localRespoUrl = \"file://\" + userHomeDir + \"/.m2/repository/\";\n",
    "var langchain4jVersion = \"0.36.2\";\n",
    "var langgraph4jVersion = \"1.4-SNAPSHOT\";"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%bash \n",
    "rm -rf \\{userHomeDir}/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/langgraph4j"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[0mRepository \u001b[1m\u001b[32mlocal\u001b[0m url: \u001b[1m\u001b[32mfile:///Users/bsorrentino/.m2/repository/\u001b[0m added.\n",
      "\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32morg.slf4j:slf4j-jdk14:2.0.9\n",
      "\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32morg.bsc.langgraph4j:langgraph4j-core:1.4-SNAPSHOT\n",
      "\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32morg.bsc.langgraph4j:langgraph4j-langchain4j:1.4-SNAPSHOT\n",
      "\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32mdev.langchain4j:langchain4j:0.36.2\n",
      "\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32mdev.langchain4j:langchain4j-open-ai:0.36.2\n",
      "\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32mnet.sourceforge.plantuml:plantuml-mit:1.2024.8\n",
      "\u001b[0mSolving dependencies\n",
      "Resolved artifacts count: 27\n",
      "Add to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/slf4j/slf4j-jdk14/2.0.9/slf4j-jdk14-2.0.9.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/langgraph4j/langgraph4j-core/1.4-SNAPSHOT/langgraph4j-core-1.4-SNAPSHOT.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/async/async-generator/3.0.0/async-generator-3.0.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/langgraph4j/langgraph4j-langchain4j/1.4-SNAPSHOT/langgraph4j-langchain4j-1.4-SNAPSHOT.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/langchain4j/langchain4j/0.36.2/langchain4j-0.36.2.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/langchain4j/langchain4j-core/0.36.2/langchain4j-core-0.36.2.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/apache/opennlp/opennlp-tools/1.9.4/opennlp-tools-1.9.4.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/langchain4j/langchain4j-open-ai/0.36.2/langchain4j-open-ai-0.36.2.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/ai4j/openai4j/0.23.0/openai4j-0.23.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/retrofit2/converter-jackson/2.9.0/converter-jackson-2.9.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/fasterxml/jackson/core/jackson-databind/2.17.2/jackson-databind-2.17.2.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/fasterxml/jackson/core/jackson-annotations/2.17.2/jackson-annotations-2.17.2.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/fasterxml/jackson/core/jackson-core/2.17.2/jackson-core-2.17.2.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okhttp3/okhttp/4.12.0/okhttp-4.12.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okio/okio/3.6.0/okio-3.6.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okio/okio-jvm/3.6.0/okio-jvm-3.6.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib-common/1.9.10/kotlin-stdlib-common-1.9.10.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okhttp3/okhttp-sse/4.12.0/okhttp-sse-4.12.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.25/kotlin-stdlib-jdk8-1.9.25.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib/1.9.25/kotlin-stdlib-1.9.25.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/annotations/13.0/annotations-13.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.25/kotlin-stdlib-jdk7-1.9.25.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/knuddels/jtokkit/1.1.0/jtokkit-1.1.0.jar\u001b[0m\n",
      "\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/net/sourceforge/plantuml/plantuml-mit/1.2024.8/plantuml-mit-1.2024.8.jar\u001b[0m\n",
      "\u001b[0m"
     ]
    }
   ],
   "source": [
    "%dependency /add-repo local \\{localRespoUrl} release|never snapshot|always\n",
    "// %dependency /list-repos\n",
    "%dependency /add org.slf4j:slf4j-jdk14:2.0.9\n",
    "%dependency /add org.bsc.langgraph4j:langgraph4j-core:\\{langgraph4jVersion}\n",
    "%dependency /add org.bsc.langgraph4j:langgraph4j-langchain4j:\\{langgraph4jVersion}\n",
    "%dependency /add dev.langchain4j:langchain4j:\\{langchain4jVersion}\n",
    "%dependency /add dev.langchain4j:langchain4j-open-ai:\\{langchain4jVersion}\n",
    "%dependency /add net.sourceforge.plantuml:plantuml-mit:1.2024.8\n",
    "\n",
    "%dependency /resolve"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**utility to render graph respresentation in PlantUML**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import net.sourceforge.plantuml.SourceStringReader;\n",
    "import net.sourceforge.plantuml.FileFormatOption;\n",
    "import net.sourceforge.plantuml.FileFormat;\n",
    "import org.bsc.langgraph4j.GraphRepresentation;\n",
    "\n",
    "void displayDiagram( GraphRepresentation representation ) throws IOException { \n",
    "    \n",
    "    var reader = new SourceStringReader(representation.getContent());\n",
    "\n",
    "    try(var imageOutStream = new java.io.ByteArrayOutputStream()) {\n",
    "\n",
    "        var description = reader.outputImage( imageOutStream, 0, new FileFormatOption(FileFormat.PNG));\n",
    "\n",
    "        var imageInStream = new java.io.ByteArrayInputStream(  imageOutStream.toByteArray() );\n",
    "\n",
    "        var image = javax.imageio.ImageIO.read( imageInStream );\n",
    "\n",
    "        display(  image );\n",
    "\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Graph State**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import org.bsc.langgraph4j.prebuilt.MessagesState;\n",
    "import org.bsc.langgraph4j.state.Channel;\n",
    "import org.bsc.langgraph4j.state.AppenderChannel;\n",
    "\n",
    "public class State extends MessagesState<String> {\n",
    "\n",
    "    public State(Map<String, Object> initData) {\n",
    "        super( initData  );\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Utility function to simplify node creation**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Utility action to simplify node creation**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import org.bsc.langgraph4j.action.AsyncNodeAction;\n",
    "\n",
    "AsyncNodeAction<State> makeNode( String id ) {\n",
    "    return node_async(state ->\n",
    "            Map.of(\"messages\", id)\n",
    "    );\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import org.bsc.langgraph4j.StateGraph;\n",
    "import org.bsc.langgraph4j.action.AsyncNodeAction;\n",
    "import static org.bsc.langgraph4j.action.AsyncNodeAction.node_async;\n",
    "import static org.bsc.langgraph4j.action.AsyncEdgeAction.edge_async;\n",
    "import static org.bsc.langgraph4j.StateGraph.END;\n",
    "import static org.bsc.langgraph4j.StateGraph.START;\n",
    "\n",
    "var workflowChild = new StateGraph<>(State.SCHEMA, State::new)        \n",
    "                    .addNode(\"child:step_1\", makeNode(\"child:step1\") )\n",
    "                    .addNode(\"child:step_2\", makeNode(\"child:step2\"))\n",
    "                    .addNode(\"child:step_3\", makeNode(\"child:step3\"))\n",
    "                    .addEdge(START, \"child:step_1\")\n",
    "                    .addEdge(\"child:step_1\", \"child:step_2\")\n",
    "                    .addConditionalEdges(  \"child:step_2\",\n",
    "                                edge_async(state -> \"continue\"),\n",
    "                                Map.of( END, END, \"continue\", \"child:step_3\") )\n",
    "                    .addEdge(\"child:step_3\", END)\n",
    "                    ;\n",
    "var compiledWorkflowChild = workflowChild.compile();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Create graph with a sub graph as action node**\n",
    "> The subgraph will be executed independently to the parent without share anything"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NodeOutput{node=__START__, state={messages=[]}}\n",
      "NodeOutput{node=step_1, state={messages=[step1]}}\n",
      "NodeOutput{node=__START__, state={messages=[], subgraphKey=step2}}\n",
      "NodeOutput{node=child:step_1, state={messages=[child:step1], subgraphKey=step2}}\n",
      "NodeOutput{node=child:step_2, state={messages=[child:step1, child:step2], subgraphKey=step2}}\n",
      "NodeOutput{node=child:step_3, state={messages=[child:step1, child:step2, child:step3], subgraphKey=step2}}\n",
      "NodeOutput{node=__END__, state={messages=[child:step1, child:step2, child:step3], subgraphKey=step2}}\n",
      "NodeOutput{node=step_2, state={messages=[step1, step2]}}\n",
      "NodeOutput{node=subgraph, state={messages=[step1, step2, step1, step2]}}\n",
      "NodeOutput{node=step_3, state={messages=[step1, step2, step1, step2, step3]}}\n",
      "NodeOutput{node=__END__, state={messages=[step1, step2, step1, step2, step3]}}\n"
     ]
    }
   ],
   "source": [
    "\n",
    "var workflow = new StateGraph<>(State.SCHEMA, State::new)        \n",
    "                    .addNode(\"step_1\",  makeNode(\"step1\"))\n",
    "                    .addNode(\"step_2\",  makeNode(\"step2\"))\n",
    "                    .addNode(\"step_3\",  makeNode(\"step3\"))\n",
    "                    .addNode( \"subgraph\",  state -> {\n",
    "                        var input =  Map.<String,Object>of( \"subgraphKey\", state.lastMessage().orElseThrow() );\n",
    "                        return compiledWorkflowChild.stream( input )\n",
    "                            .forEachAsync( System.out::println )\n",
    "                            .thenApply( ( res ) -> state.data() );\n",
    "                     })\n",
    "                    .addEdge(START, \"step_1\")\n",
    "                    .addEdge(\"step_1\", \"step_2\")\n",
    "                    .addEdge(\"step_2\", \"subgraph\")\n",
    "                    .addEdge(\"subgraph\", \"step_3\")\n",
    "                    .addEdge(\"step_3\", END)\n",
    "                    ;\n",
    "\n",
    "var compiledWorkflow = workflow.compile();\n",
    "\n",
    "for( var step : compiledWorkflow.stream( Map.of() )) {\n",
    "    System.out.println( step );\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Display Graph** "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAH0AAAK1CAIAAABqxnaCAABC80lEQVR4Xu2dd1wUx9/HUZHYYi8UwRZjAUV/itGfCraf5NFEo+ZnQfPS2OXxF58EuwgqCIIFBUUUBWw0CwoKok/sEVvAroAKKmABC3YUw/N5dl5uNgOcd8fezZ6Z9x+89mZmd2ffM/udmePu1qiIwwIjOoGjF7h3NnDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnA0nvnzp2rVq0aHh5OZ+gd/deEpfe2bdsaGRlt2rSJztA7+q8J9/7/6L8m8njPzMz8z3/+07p16ypVqrRo0SIyMpKk9+rVy8bG5vjx49hOT0+3EXj//j3JJVe7Zs2aESNG1K5du3nz5lu2bBGPKZKXlzd06FAUaNSokY+Pzz/+8Q8cJDc3l+QOGTIEL7dt2zZs2LAaNWrcvHlz8eLFffr0qVu3brVq1QYPHnzjxg1pSQST4qcjNQkODp48eXKDBg26d+9++PBhkqUj5PHes2dP1Ltr166zZs1ydHTcsGEDSTczM0N6fHw8ti9dumQkQHn//PPPIeizzz7Ddrly5e7fvy8elgALyKpcufLYsWMtLCzIQXJyckguOQiOgL+VKlWCZQhFvJ45c2b79u2ROHDgQGnJEk9HstAYFStWRKDHtp2dnVgBXSCP9zp16qCu7u7uf/zxhzRdHe///Oc/nz17dvv27Vq1auHl5s2bpUc4c+YM2SsxMREvr1+/Tl5S3ps2bYoscuSXL1+SrNOnTyMLN4G0ZImnI1mNGze+e/cu7k5yisePH5MddYE83qdOnUrq2qxZM8QN0aw63sWo2rdvX7wcNWoUeUkICwtDIrrhq1ev8BLdkxyE8h4SEiLugoD2008/9ejRAx3fSLgJpCVLPB3J2rhxI7bv3btHTlH8zpMRebxD5bJly+rVq0dqPGnSJJKukfd+/frhJUI5eUlACEYiwsLbt2+LSvcuHgTWEKCRAu9jxowxKt279HTSLPEUBuCd8ObNG4xLqDFG13fv3iGlYcOGeBkaGortCRMmkOuhvJNehgCF8IqX8+bN+/OIRUUPHjxAFEb67t27CwsLxRurNO9eXl5GQjDBdmpqqpHQZtKS1Onmzp1LHcRgvEOHra0t5jNbt27FpAI1xmWQLPISvR6TkPLly5Probxj4uHr60sGT2NjY0xI/jy0QIcOHciOiNTVq1cn22gPkkt537lzJ14ids+YMcPS0pIUJgsiFaczSO/wiBmkiYmJkdDT+/fvf/HiRZKFMeqLL74wEsY9TPXI9Yje0Vp4ifsAocBI0BoVFfXncT+AANWlSxcc2d7eHnGcHOT58+cklxxEHI0Rjv7rv/4LbVyhQoX/+Z//QcdHLqpX9EEupl44FHU66UEMxjsBvf7WrVuvX7+m0nFHY5JAJVIUFBSg34ntQXH16lUyW8cpXFxcjIQbiC70V3A3vHjxgmxnZGSQbbFTqz6dfpDNu+7ABBy+WrZsSWarQFwfaAQVkdhiAN7j4uIwL0SQadOmDdogNjaWLqEeOMg333xz6NAhOoMFBuD9k4R7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDcr1fvbs2VOnTtGpnwrK9d6kSZMhQ4bQqfJBPnDJCuV6R2fPyMigU+Xg9evXVapUmTNnDp2hRxTq/cKFC1OmTCHeyXZ6enpgYODgwYMXLlwofjKdZF2+fNnHx+fbb7+dPHnyvXv3SNZvv/2GLPFrIcHBwW5ubtjIysoaMWKEkZGRvb29eAr9owjv6IBDhw49cuRIWlpajx49nj9/vmTJEqjJy8tDLtm2tbX94osvyBdL1qxZQ3YkWc2bN+/UqRP5OBh2J1kuLi7ip7eBjY3N119/jQ00kp2dHUqOHTsW3jGK9OnT5+XLl5s3b/75559JYT3A3nt+fr6Dg8OAAQOSkpIaNGiwevVqJP773/9u3LgxKYBtow+fz3716hW2Z82aJWZ9/vnnMTExRcLHYzt37lyhQgXywUc0gPhdGWhFuvgJ73HjxtWuXZtsv3nzBs323//938nJySiTkJBA0nUNY+/3799v3749pCcmJtaoUYNIL/rroIptFCDbiDbwvm7duuLFAHp0tWrVioQPw1avXh1hh6SfPHkSe5HmKRI+/fuvf/1L3Auuy5Urd+DAAWdnZ3Nz80ePHolZuoOx9/Xr18MI+hqis5WVFQkLCN9I9PLyorZBZGQkXv7+++/YhiBpVmFhoaWlZf/+/Ys+fOMAMZ1kBQQE4OWdO3eKhJhmbGw8e/ZskgVOnDiBFDQ5boiaNWtizBCzdAdj7+iYvXr1Qpy5e/curnnp0qVIPHjwoNGHL5JJt8H06dNNTEwKCgqKZ+3atQsvT58+je2IiAhsI3YXCZ/JRgevV68eKUa+qCZ+NRvScZ+hhTw9Pc3MzMRP7usaxt4BuiGufN++fdu2bUNwKHFQJdtFwhc2O3ToQLZJlpOTU2ZmJu6DZs2aOTo6kizSwVesWBESEkK++EAGVXD+/Hm8dHV1ffHixfXr1+vWrYsGCwoKQrFbt26RMnqAvXdw7do1MhhislEkfDtHHFSl26BWrVoTJ04k2xhUTU1Nu3XrZiR8E7Vfv37iNzRu3LjRqlUrpDds2BBNIh1UMcaS+Uzr1q1x0qtXryIR003xizv6QRHetUMcVLOzszEporOLilR8zwRZ4tdcmWCo3qnx1uAwVO8ITd988w0ZRQ0RQ/Vu6HDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzYYtvfU1NRVq1YtEfDx8QkICEhPT6cLKRJD9Z6VleXm5rZx40Zs5H8A26GhoYsWLRJ/jUmxGKT333//3d3dPTc3VzQuBekeHh7nz5+nd1MShuf97t276Om07GJAvZJ7veF5d3V1La2nS8nLy0PAoXdWDAbm/erVq4jgtONS2Lp1a1paGn0IZWBg3jF7kQ6kqrl3715gYCB9CGVgYN69vLxou6Xz7NmzZcuW0YdQBgbmffHixbRdlXDv8sD7Oxs0iu/379/n8V0erl27xuczbJg/f7468/dHjx7x+bucIM64u7vTmovh6enJ16syk5ycrOL9GaxU+fszuiI7OxvqQ0JCqPcjw8LCFP7ODMFQvRPS09P9/f19BHx9ffn77/rG1NSUTlI23DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3NnDvbDA872FhYeQhklI+6r3EvRhiAN6pZxgPGjTI2tpamlIkeKeKSUFWiXsxRNHeL1y4MGTIkKpVq9auXdvT0xMpbm5u1apVMzExad26NXlUcGho6Ndffw3v9evXd3d3F/cdP378yJEjAwICLC0tu3btSu3FHEV779KlC0zt2bMnJCSEPJbvt99+a9++vbm5OVL27duHlIkTJ06dOhXeybNeb9++Tfbt3bt35cqVkT579uzVq1dTezFH0d5hzd7envoBhxIjBkqSR56LD9qG9ypVqqSkpJCXJe7FEEV79/DwgEoLC4tVq1aJj0ulDL5+/XrLli3wTp6XHRQURNLhHbeLWIx714zo6Oh27dpB6IgRI0iK1OC7d+8cHBzq1q0L72vXruXe5QQ9HSNkhQoVyC+uDR48uEmTJiQLoR+uMUeE9+zsbGzDPsmivEv3UgLK9Y7Jn7Ozc1xc3M2bNx0dHTFdIY9rJk+Mj4+Pf/78OfmxsEmTJsE7ymAbYyzZnfIu3UtMZIiivbdq1Yo8hb5t27a7d+8m6ZmZmZicIBFm8RLzQmNjY3hHIw0YMMDow6969unT55///Kd4NGov5ijXOwGTGQQQOvWvP1SVm5tL1qtoKvhVsYBi/vNWIkr3riYffZ9AaXDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3NnDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBkP1Tj23hvKu/KfaGKr3oKCgkydPii+l3pEu/sqYYjFU73l5eV9++aWoXvS+efPm1q1bI/fPoorEUL2DIUOGWFlZEfXE+9KlS5Hi4uJCF1UeBuz92rVr0N24cWOoxwakmwko9tmfUgzYO+jWrRuMf/HFF6YCDg4OTk5OdCFFYtjeExISzM3N0cch3cLCAs1w9OhRupAiMWzvAKMo6eyDBw/u2bMnna1UDN57QEAA6e/ffPNNREQEna1UDN57QUEBhtbu3bvb2tpim85WKgbvHfzyyy+WlpYrVqygMxSMwXh/+/YtJo6//vpreHj48uXLfXx8lnzA3d0dXR5/yUvyGFw0Q2Rk5KFDh1JTU9+9e0cfjjXK9Z6dnR0XFweD3t7eXl5evr6+0dHRx44du3r16qNHjyTP0/5/4JdKwZIVJTG9gX1yEDQJGmz//v3kd7XZoizvDx48gKbFixd7eHhs2LDh9OnTT548oYSWBTQGFllr1qzBKdAS8fHx5De29Y8ivGdlZQUGBi5atAh/L1y4QNvSGSdOnMAdgDaOiorS8+81s/SO6QdmftAdFBSUkZFBW9EjKSkpS5cuRQOcPXuWrqVuYOMd8WTZsmWenp64TtoBOxDTdu7c6erqunv3bvFxIjpC394xpi0TuHv3Ln3digHxZ+7cuYmJiXTt5UN/3jERRPjGpOL27dv0hSoSzHxg//r16/SVyIGevJ86dWrWrFn6HDNl4fHjx6sF0GnoSyobOvdeWFiIOUNoaCh9TToDYTogIACTdzpDWy5evDh9+vQSH3ehNbr1fu/evRkzZiQnJ9OXopKEhIQ2bdrs3btXTBk3bpy/v7+kiCowVhsZGWHuT2eUgdzc3IULF2LVRl+htujQe3p6+uzZszF1oS/iY7i5uUFcr169xJQGDRps27ZNUkQV69evr1KlirwLLsK6devIYwLLjq68X7p0CRMyxEe67mrw7bffVq9eHeqxtsTLa9euYVuMG2iASZMmOTs7HzhwQNzl6dOn0D1mzBgsRCdOnNi5c2eSiEUvElGThw8fioXLQlhYGOaa9NVqjk68Z2Zm4lJx2XStSwEDAFZPmL31798fLy0tLf38/KpWrerk5ISXWFvVrVuXlJwwYUK9evWmTZvm4OBgbGx87tw5kj569GjcEz///LO1tTUaafLkySTRxsYG91z9+vUxj0JKSEgIhnc0ZO/evRE6yL6agrY8cuQIfc0aIr936MYolJeXR9e3FObMmdOpUyes1KEb13Pr1i2IwwISPdrExATTOJjq06cPSp45cwauyU2As5QvXx69G9uwX6FCBbIEw/qgUqVK5NM1iDZQjJJDhw5FlfKFWwd3Em4Ue3t7NJK0GhqBXoJ60leuCfJ7nz9//p07d+ialoKLiwt6aHR0NHr34cOHkbJr1y6ogazLly/DJuw4OjoSa4MGDYIvsiPCN/xiZY/t4cOHi+lkUMW09bvvvjOSMGXKFFIAh2revDkaGM1GmlAL0LqYL5RlTSuz9/j4+JiYGLqapYNgXbt2bXRkRI+tW7fmC4Nq9+7dSe7gwYNr1KhRs2ZNMqiihUaNGkWyEHwqV66cmpqKbTs7u/Hjx5N0cVC1tbUlYUpKUlKShYUFAgXC1NixY8sy9qJpN23aRF+/2sjpHYsLLPDoCn6MkSNH/vjjj+Hh4YgzmPxgUP3pp59IFnol6a1kUMUMp0OHDpgmoZ+2bdsW9wop1q9fv44dO2K2ivBdrVo1MqgOHDiQfKoJtw4CEXooWrdp06boFj169Jg5c+aH82sPZpZaP2VRTu+RkZFazJqzsrIwL8bGvn378BeypIusbt26iYMqmsHU1NRYYMSIEVjIkPQ1a9YgIiFuICKhPcigimZo2bIl2gwtAd3wnpGRQZqBnKjsXLlyJTg4mLagHnJ6R2SnqyY3sIaRtvhUJCcnp8RBJS0tDWs3OlU+EBVpC+ohm3f0PsRWul6fOpjO37hxg3ahBrJ5x6iIGQhdr08dDOxQT7tQA9m8+/j40JX6e4AVGe1CDf523h8+fIigT6eWAcbeyUJcyWDF1KVLl88++0xcQ8nCJ+J97dq14sRcXurXrz9s2DDMOD8p71rHGertM6ybWrVqJU0hPBWgUwVKS6cgxapWrSqvd1w47UINZPOOBeelS5foSqkEq5gBAwZgWV+rVi0y9581axa8mJiYYMmDvkmKYRGLNT3K1KhRw9nZmby3PHr06KFDh/r7+zdr1gxHGDJkiLiMUo283rGY2LJlC+1CDWTzjuWJpvP3Tp06wW9ERAQWnFjrIuXAgQNYcJqZmSFl+/btpNgPP/wA6bidsbjHotTPzw+JDg4OlStXNjc3/+WXX+zt7bEunT17tvTgpSGvd0wisQymXaiBbN6LNF+vNmjQoGvXrvfv35cmUnEGcw+4njp1KnlpbW3drVu3fMG7qamp+M8QW1tbOzs7cS8VyOvd3d2dtqAecnrfs2cPeadFTVxdXdFP0WcRIsW3Binve/fuRRkothaAtUaNGuUL3nG7iMUQiDBgqvOZHBm9nz9/XrsgUySv98LCwjlz5tC1U8mmTZvatGkDs99//z1JobzHxsaSXP8PBAcH5xfzPm7cOBQr8S0aChm9u7m5vX79mragHnJ6B6dPn4ZKuoIqQU/HCInempmZmS94Jz2agIV4uXLlHB0d/9xBgPLerl27OnXqSPJLRS7vGIpiYmLo61cbmb0XCV/eVWdig1nd+PHjo6KiLly40Lt373r16pE3DhEx0XN37NiRk5NDSjo5OZF/PCUlJR08eDAoKChf8F6xYkUUvnjx4ty5c42Njcn/pFTw22+/HT9+vFKlSrh7sHHt2jW6hNpkZWXNmzePvnJNkN/7u3fvMLUgnVcF8N6iRQuMmbCMwI1pKEm/fPkypjRIhFmSggbAlAZmkQjXPXv2zBe8W1lZtW/fHom4ITCPpMbn4mB6Sv6LQhD/RaUpjx49wswK9aevXBPk9w5evHiB3qfOKAdZmALTqcI/oCmPubm5GMfEd97FOIPd1TmRXCAq4ia7efMmfc0aohPvAFWcMWMG+f+nLqDiOwHjqk1JqDPeqgN6OsIL+gR9tZqjK+9FwtcKMKM/cuQIXX05wJ0+bdo0KhF3Q3BJFP//lBag8bCcRvykr1MrdOidsHnz5pUrV2r3wTHlcPToUaw2nj17Rl+etujce5HwwxnoKZhO0FdjCDx48AAzNK3XR6WhD+/gjz/+wIxl4cKFGJHoK1MwO3fuxCiKCS59PWVGT94JuJJVq1YtXrxY3v/46IK4uDgMoSdOnKCvQSb06p2AKLlmzRr0I/LBPEWBqLJx48YFCxbo+vdUGHgnFBYWxsfH4wpxB8j43QytQSfw8vLy8fHR7nMZmsLMuwgmeZs2bULoX758OZbvZfnMoqagdyckJEA3Ql9iYqLsX2JSAXvvIhCBO8Db23vRokV+fn4QkZWVRasqM7dv396zZw+mKJ6enmhpzLL0qVtEQd6loNcjwpIfEvAUCAwMxFiXkpKSnp5OuywFjN7JycmxsbGrV6/GEXAodO3169efPXv21atX9Cn1i0K9U7x//x4x4dSpU9u3bw8JCSG/0EFYLEFM9BYIDQ3dsWMHLOfl5WEiSx+UKYbh/aOY8t8HZgL3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3NnDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3NnDvbODe2cC964n09HTpS8o7latADNU7eZKz+FLqHenIFV8qE0P1npeX16pVK1G96P3o0aOtW7dG7p9FFYmhegcDBw5s0qQJUU+8Hzp0yMrKysXFhS6qPAzYOyxDd/PmzaEeG3jZsGFDMzOztLQ0uqjyMGDvwMbGpmXLlggs8G5paYmXTk5OdCFFYtjeMX7C+FdffQXp2OjYsaOuf9dXLgzbO0CINxVo27Ztjx496GylYvDep0+fTrx37949IiKCzlYqBu/9xYsXFhYWTZs2RX8vKCigs5WKwXsHw4YNg/oVK1bQGQrGYLy/ffv2+vXrmCxGRUWtXLlymQRXV9dGjRotWrRImogyKHn48OHU1NR3797Rh2ONcr3n5OTEx8fD4NKlS319fdGdd+3ahak6PD59+vS5gPjT12gPskHSEXxQBhP5pKQk7LV8+fKlAuTnzR89ekSfTO8oy/vDhw+3b9/u4+Pj7e0dFhZ27tw5NZ/hrA7Pnj3D0c6ePbt+/XofgYSEBLQQXQm9oAjv2dnZ69atIz/OfvnyZVqYboDx06dPr1q1CueNjo5++fIlXS1dwtI7ph+4YFx2cHDw7du3aTH6AvcBGhshCDXBHUbXUjew8Y54gnEPweT333+nNTAlNjZ2wYIFe/bsef/+PV1pWdG398ePH6NnQbount0hC+j+iD9ubm4HDhygay8f+vOOiSCCOCYVcj0dUqfA/q+//jp//nxMn+grkQM9eccsYu7cuRcvXqSvT9k8efIkKCgoMDBQ9mfe6Nx7YWEhosrmzZvpazIcrly5MmvWLEy66GsrA7r1/uDBg9mzZ6ekpNCXokvQSQMCAuR9BlpeXp6np+fx48fpK9QWHXq/efMmYgvU0xfxMbCcadOmzd69e8WUcePG+fv7S4qoAjHNyMgIYyOdUWY2btyIWtHXqRW68o57093dXbvH3WIuAXG9evUSUxo0aLBt2zZJEVVg8VWlShUdPW9uy5YtMTEx9NVqjk68Y8YCd1ov8b/99tvq1atD/cmTJ/OFZ5xjW4wbaIBJkyY5OztjnifugnNB95gxYxYvXjxx4sTOnTuTxA0bNiDR1dUVKwaxcBkJDQ0t+3+15PeeLzz8GgGRrm/pLF++fNGiRSdOnOjfvz9eWlpaYo5ftWpVJycnvIyIiKhbty4pOWHChHr16k2bNs3BwcHY2BjLS5I+evRo3BM///yztbU1Gmny5Mkk0cbGBgNM/fr1lyxZgpSQkBCMkGjI3r17l+Wh22jdjIwM+so1QX7vWO9pNEOfM2dOp06doqKioPvIkSO3bt2COAzF6NEmJibXr1+HqT59+qDkmTNn4JrcBOjL5cuXx/VjG/YrVKiAsJ4vPPK9UqVK5FNNiDZQjJJDhw6dPn16vnDr4E7CjWJvb49GklZDI3AW1Kosa1qZvScmJmKRTVezdFxcXNBDo6Oj0bvJY3B37doFNZB1+fJl2IQdR0dHYm3QoEHwRXZE+IZfDw8PbA8fPlxMJ4PqqVOnvvvuOyMJU6ZMIQVwqObNm6OB0WykCbUDp8DkmL5+tZHTOxYXiKR0BVWCYF27dm10ZESPrVu35guDavfu3Unu4MGDa9SoUbNmTTKoooVGjRpFshB8KleujMUktu3s7MaPH0/SxUHV1taWhCkpSUlJFhYWCPoIU2PHji3j2ItWf/78OW1BPeT0jm6rxext5MiRP/74Y3h4OOIMJp0YVH/66SeShV5JeisZVDHD6dChQ3p6Ovpp27Ztca+QYv369evYsWNycjLCd7Vq1cigOnDgQCsrK5TErYNAhMiA1m3atClmIz169MAI9OH82oM5G2aWtAX1kNM7Jo501dQgKyvr2LFj2Ni3bx/+QhYmDGJut27dxEEVzWBqamosMGLECCwgSfqaNWsQkRA3EJHQHmRQRTO0bNkSbYaWgG54x0hImoGcSBZwybQF9ZDNOywEBwfT9ZIbWMNIW3wqkpOTU+JgnpaWdu/ePTpVPjZt2oTlIe1CDWTzjhCst38VKQcMMFBPu1AD2bz7+PjQlfp7gAunXagB915WsCKjXaiBbN7JglDhICxgxqXFW3UqYOxd4f194cKFmKeSWSnWBJj/0SW05RPxvnbtWnFiLiOTJk3y8/PLzMyMi4tr1KgRJpclzn+0gLF3rDa1m89Qb1ti3dSqVStpCuGpAJ0qUFp6acyZMwe9PiEhgc7QHASusLAw2oUayOYd83es0el6qQSrmAEDBmBZX6tWrfnz5yNl1qxZVatWNTExwZJn2LBhpBjCMdb0KIP44OzsTN7THz169NChQ/39/Zs1a4YjDBkyRFxGfRR0fHiXvo2sNZB+48YN2oUayOYduLm50fVSSadOneA3IiICC87IyEikwAUWnGZmZkjZvn07KfbDDz9AOm5nLO6xKIU1JDo4OFSuXNnc3PyXX36xt7eHx9mzZ0sPXhpPnjzBGvjzzz/HCpbO0xxcMm1BPeT0HhUVpdH7Mw0aNOjatev9+/eliVScwYITrqdOnUpeWltbw1q+4N3U1FT8Z4itra2dnZ24lwoweBgbG5NmLiNXrlzZsGEDbUE95PT+9u3buXPn0rUrHVdXV/RT9FmMyeJbg5T3vXv3ogwUWwsgCmFUzBe843YRiyEQVahQ4e7du2JKiaB6KBYUFERnaAXmSIp4PxJgsIqJiaErWDpYZLdp0wZmv//+e5JCeY+NjSW5/h8g7wJR3seNG4diqqco3t7e5cqV03QQKo1Tp05p9w4BQWbvACOk6uunQE/HCIluiElevuCd9GgCJgyQ5ejo+OcOApT3du3a1alTR5JPs2/fPhxHzTHgo2BsmDFjhoL+31Qk/H91+vTpH/3/KiZ/48ePx5Bw4cKF3r1716tXj7xx6O7ujp67Y8eOnJwcUtLJyYn84ykpKengwYMkSsB7xYoVUfjixYuIHgjZ5H9SpYEBAIf19fVd+wGMHHQhtVm0aNGtW7foK9cE+b2D27dvI3arnlYjt0WLFhgzoQOBOzw8nKRjEYApDRJhlqSgATClgVkkwnXPnj3zBe9WVlbt27dHIjoy5pHU+ExRt27d/1+qSkAEowupB8bSI0eO0NesITrxDi5dugT1H/38DGRdv36dThX+AU15zM3NPX/+vPjOuxhnsPtHh1MZwYR9586d9NVqjq68Fwk/AoN4Ku+bUCJUfCdgXLEpCY3GGxWsW7cuLi6Ovk6t0KF3gD6LxU5ycjJ9BWUGh502bRqViLshuCSK/39KU3AEzBqPHTtGX6G26NZ7kfB54OXLl0v/ZWpwYOjG7MWQPg8sgnXsrFmzMHWhr0nZYHxaLWB4n38XQdUxe1uyZAnDr5BpxP79+zFDNezve4hgxbFs2TJEHn1OQjTlxIkTMJ6YmEjXXj707Z2ASQ7se3p6kg81KgSsnDFHxHp79+7dZVmLqgMb74SCgoKIiAis/bAEzcjIoDXokZSUFNIPPvHvr1JkZWUFBgaiAfBXn2Mv4smKFSs8PDyioqL+Rt/XLs7Dhw8jIyMXL16MroflOGZBZfzoKEVeXt7JkyfRujiFt7d3fHz83/r3CUokJydn79695DcivLy8li5dGh0djZXL1atX1flXERSj5NGjR9GXfX19cRBMpTCe89/j0Azy+zO//vorhgQEB/KDGks+YGpqSjZIOvndFNw6/PdndIsp/11mJnDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3NnDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdy7nkhPT5e+pLxTuQrEUL2TJzmLL6XekY5c8aUyMVTveXl5LVu2FNWL3mNjY1u3bo3cP4sqEkP1DgYOHNi4cWOinngPDw+3srJycXGhiyoPA/aekpIC3c2aNYN6bEC6ubm5mZlZWloaXVR5GLB3YGdn17BhwxYtWsA7pH/11VdOTk50IUVi2N537NiBDo5oA+lQ36VLl6NHj9KFFIlhewdffvmlqUCvXr169uxJZysVg/fu7e1NvPft2zciIoLOVioG772goMDS0tJWANt0tlIxeO9g4sSJGF1XrFhBZygYpXt///79nTt3kpKSsCCKjIxcuXKlr68v+RFg8SeC58+f36hRI3d3d2m6r4C/vz/22rt376lTp3Ac+ujsUJD3N2/eXL58effu3cuWLSNCyY9Yb9q06cCBA+fOnbt69WppTwQ6dOgQnSTw8OFD7HX27NnExMTNmzeTAwI0CZpw3759169fZ/KrzSy9IxwnJyevW7eO/NL48uXLd+7c+fvvv3/0KWeykJeXd+bMmejoaNLGYNu2bWgkupa6Qd/e0blOnz6NvrZ48WJ0OvRuuR4mVnauXbu2fft2L4GQkJCbN2/StZcPPXl/8eIFLsnT0xOXhGir+hmGSuDGjRtbtmxBhdE5MDbQ11NmdOsdIRu6Fy1ahBiCAE1fnCGAcIRhwMPDA+EIww99hdqiK+9XrlxBxEQwQQylL8UwQQNgarRgwQIMA69fv6YvWEPk937kyJF58+bhJsVcgq67jnny5ElAQID4sHMdkZKSgmiJE2Gbvni1kdM75mpz587V+nmyhISEhDZt2mAMEFPGjRuHabikSKlgvmhkZKTRM+21BgMApmGYIGj3aHN5vGMWPHv27Pj4eLp2muPm5gZ3vXr1ElMaNGiAW1tSpFTWr19fpUoVeR89pBrYX7hw4Y4dO2gjH6Os3hHpMOIHBQWp82wfdfj222+rV68O9SdPnswX5nbYFkMHGmDSpEnOzs5YSZGUp0+fQveYMWMwlkycOLFz585i+oYNG5Du6uqq64iH0Ipul5mZSdspnTJ5v3Tp0syZM8vygHCAqQ4mPCdOnOjfvz9eWlpa+vn5Va1a1cnJCS8jIiLq1q1LSk6YMKFevXrTpk1zcHAwNjYmE6TRo0fjhvj555+tra3RQpMnTyaFkW5jYwMd9evXxwiP+fisWbPQir179y5t0VsWMOoi7GA5QjsqBe29h4eHY2wp4009Z86cTp06RUVFQTd6za1bt+AOAxd6tImJCcIXZPXp0wclMS+Ca3IToC+XL18eHRzqK1SoQB6uiBuuUqVK5GnzKIaAA8soOXTo0OnTp2MbtxHuEnt7ezTSXyohHxiW0MbqPFNRS+8Y6NC29Gk1xMXFBZ0UK3X07sOHDyNl165dsANZmClDKAQ5OjrCGrIGDRoEZWRHNDYUY049fPhwMZEMqljjYPu7776TPDneaMqUKUjEcZo3b47WRZuR9tMFycnJmM599Dm52njHCuLo0aP0CTUHwbp27droyIgeW7duzRcG1e7du5PcwYMH16hRo2bNmmRQRQuNGjWKZCH4VK5cOTU11c7Obvz48SRROqja2tqSMCWSlJRkYWGBiI8YNXbs2DLepqrBvYX7uLCwkBYnQWPvCJQHDx6kT6UtI0eO/PHHHxGyEGcePHiAQfWnn34iWeiYpLeSQRUznA4dOqSnp6Ortm3bFvcKEvv169exY0d0MdSqWrVq4qA6cOBAKysrlMStg1gE6U2bNo2JienRowcGpA8n1yEIleidtDsJmnmHi82bN9MnKQNZWVnHjh3DBtbi+AtZ0iegd+vWTRxUcWpTU1NjgREjRmRnZyNxzZo1CEeIGwhHaAxxUEVLtGzZEm2GxoBx0lpoA3IW/RAXF4ewSRv8gAbeCwoKMD2gD69HIA4jLTUbycnJKe0dTUy07t27R6fqEXd399JWVRp4DwwMxHBHH5tTOrjPSvvvo7reMTfCwow+MOdjYGlS4v+z1PV+/PhxWd4G+LuBOcihQ4dom+p79/X11fW/33AKT09POlX36PS8mLBiJUXbVN87dqYPKTeYWWPtSqfqHl2f19vbm7bJvefr/rxsvGPyRyeVgvT61d9LRLrLUwFJ5l+gssp43o9SJu9axHcsVQYMGIC1e61atebPn08SsSKdNGkS2c7IyMDqBktN8pJcv7+/f7NmzbDXkCFDyOII3L9/f/To0TVr1sQyCmuINm3akIiMxKFDhy5dutTCwoK824XJbp8+fapXr16vXj3paoOULPHg5LxYM+OwqOq0adPEvcoO4nuJC1d1vWsxn8HFQGtERARWlZGRkSTR2toai3uyjektlpTLly8nL3H9lStXNjc3/+WXX+zt7ZElihs+fDjWpT/88MOWLVuwiEUWeTuB7ELeByZr0TFjxkycOHHr1q2DBw9GsStXrnz04MjCsrZGjRoTJkwYOHAgsn799VeSVXbKOp/RYv4OHV27dqU+sqHau6mpqfgvDltbWzs7O2ykpqaWL18etw5Jx21nYmIi9X7ixAmSJeXcuXM4OJqcvCzt4CTL2Nh4586d2MZ6GHu5ubmRrLJT1vk7WLt2rUbrVVdXV1wDuhhuNPH9P9XepePb2LFj0cfv3r0bFxeHYgh0YtZnn30meqeGxAcPHqxfv378+PF9+/bFXitXriTppR2cykI9sdecOXPEkmVBhvVqkfD+jKYV2rRpE4ImruT7778nKep7HzduHHLv3LmD+1RqML90748ePUIUqlOnztSpU/38/FR4Fw9OZcnrfcGCBTK8P1Ok1fuRuBIMaOhcmZmZeGljYwM1JAvGVXhv164dDOYLR8BwinhN0kNDQ40k8V26C8YSZOG+zP8QMWCfZJV2cCpLRu979+6NiYmhDX5AM+9Far//jgkZbvaoqKgLFy707t0bswvy1iDGPQxiaLwZM2ag21LeK1as6O7ufvHixblz5yLmkv805Qtv06Nk+/bte/bsaWlpiW0ye6FsHj58GFk//vjj9u3bcVJsY4wlWSoOrgvvKSkpCIy0Owkaey9S7/9N8N6iRQuMh7gMxBbM0kg6dvziiy+QCH2Y5GADEZBk4fox3EEuEsuVK4epnjgmo82cnZ0xEjo5Oe3fvx+HxeCB9B49enz11VekDGHYsGHkPXq0OgKa2K44uJWVVYkHlx6EeEfDiAfUAp38v4kQEBCwZ88e+oTFwLXhfqdThZrRScL/QHJycvKFEEFGvBLZsGED1ISFhdEZH7h16xY5Dvk/LVkKiZ1a9cHLTnJyMvqETv6/SkAwLfvnCdRk5syZGJmxPsKaC3EZPTcvL48upBIqIukIxHQEAx1+noAgy+dn1CE4OBjjKsbkjh07YgqIGT1d4mOgnvIuRCnQD5YsWaKPz88QyOfF1q1bJ9fnxQwRTPMQ0PX3eTERdECcOCEhga7Rpw6zz0dKOXDgAGYCWF7StfsUgXEEllWrVpW2MlKNnN4JuOkwoG/dulXXnwZlxfnz5728vFavXp2vkM+/S7l69SpGdtTvU/q+B5aBiCpYiyjx+x5S3rx5g9jn4eFh0N9vio+PJ18wM4DvN1G8ePECDYDae3t779u3T/nf57t58+a2bdvIlz0N7/t8xXn37h0iD4YjhCCsg7DoLe3TXvoHS1l0Dm+B0NDQT+H7qyVSUFCQkpKyfv16TAzQDCtWrIiJidHz97W3b9/u++EHDxC4P9nva6uA+n0C8vV1/N28efPBgwdV/z5BaZDfJ0Bb4ghbtmwh34f3EX414u/7+wTqIP4eB5YFmE4gQCE6+UogLWRqakpsiiwVCAgIwF789zh0hSn/nVomcO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3NnDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3NnDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7l1PpKenS19S3qlcBWKo3oOCgk6ePCm+lHpHOnLFl8rEUL3n5eW1bt1aVC96RwrSkftnUUViqN7Bv//976ZNmxL1xDu2GzVq5OLiQhdVHgbsfceOHdD95ZdfQjc28NfKysrMzCwtLY0uqjwM2DuA9E6dOtnY2MB7kyZNmjVrNmLECLqQIjFs715eXjCOgAPp2LC1tT169ChdSJEYtvd3795ZWlqaCiDWOzg40CWUimF7BxMmTCDeEXAiIiLobKVi8N5zc3MxllpYWCDKFxQU0NlKxeC9g/79+5ubm5f2JDxl8il4T0lJad68ufLXSlIMxvvbt2+vXr36v//7v+Hh4cuXLye/sAzIz4b/5z//wV8x0cfHB90f4f7QoUOpqalMfnlZNcr1np2dHRcXt0T4iXLy+/fR0dHHjh2DfXWeWYTuj5KYVkZGRvoIT7xAwyxbtmz//v3YnT6Z3lGW9/v370MTLHt4eGzYsOH06dPyPg8NjYFl7Zo1a3AKtER8fPyLFy/oSugFRXi/e/cuXCxcuDAwMPDChQu0LZ1x4sQJhCy0MRr75cuXdLV0CUvvb968QbBetGhRUFBQRkYGbUWPYGReunQpGuDs2bN0LXUDG++IJwi1np6euE7aATsQ03bs2OHq6hoTE6POsw3Lgr69I8KiZ0G6Th/GWUYQf+bOnZuYmEjXXj705x2LSYRvzE9u375NX6giwcxnzpw5169fp69EDvTk/dSpU7NmzdLnmCkLjx8/Xr16dUBAwEefY6spOvdeWFiIqBIaGkpfk85AmIYpTN7pDG25ePHi9OnTs7Ky6GsrA7r1fu/evRkzZiQnJ9OXopKEhIQ2bdrs3btXTBk3bpy/v7+kiCowVhsZGWHuT2eUgdzc3AULFmDVRl+htujQe1paGmLLgwcP6Iv4GG5ubhDXq1cvMaVBgwbbtm2TFFHF+vXrq1SpIu+Ci7Bu3brY2Fj6OrVCV94vXbqECZl2Tx779ttvq1evDvVYW+YLD0HHthg30ACTJk1ydnY+cOCAuMvTp0+he8yYMViITpw4sXPnziQRi14koiZyPZQ0LCxMi6fcFkcn3jMzM3Gp5EHu6oBFI1ZPmL31798fLy0tLf38/KpWrerk5ISXERERdevWJSUnTJhQr169adOmOTg4GBsbi8+4HD16NO6Jn3/+2draGo00efJkkmhjYzN79uz69etjHoWUkJAQ3IJoyN69e2v66DMRtOXhw4fpa9YQ+b1DN0Yh9Z/3jrlap06doqKioPvIkSO3bt2COCwg0aNNTEwwjYOpPn36oOSZM2fgmtwEOEv58uXRu7EN+xUqVCBLsEePHlWqVIl8qgnRBopRcujQoahSvnDr4E7CjWJvb49GklZDI9BLUE/6yjVBfu/z589X/xGTLi4u6KHR0dHo3ehESNm1axfUQNbly5dhE3YcHR2JtUGDBsEX2RHhG36xssf28OHDxXQyqGLa+t133xlJmDJlCimAQzVv3hwNjGYjTagFaF3MF8qyppXZe3x8PBbZdDVLB8G6du3a6MiIHlu3bs0XBtXu3buT3MGDB9eoUaNmzZpkUEULjRo1imQh+FSuXDk1NRXbdnZ248ePJ+nioGpra0vClJSkpCQLCwsECoSpsWPHlmXsRdMi1tPXrzZyesfiAstruoIfY+TIkT/++GN4eDjiDCY/GFR/+uknkoVeSXorGVQxw+nQoUN6ejr6adu2bXGvkGL9+vXr2LEjZqsI39WqVSOD6sCBA62srFAStw4CEXooWrdp06boFj169Jg5c+aH82vPwoULtXuoeZG83iMjI7WYNWM9gnkxNvbt24e/kCVdZHXr1k0cVNEMpqamxgIjRozIzs4m6WvWrEFEQtxAREJ7kEEVzdCyZUu0GVoCuuE9IyODNAM5Udm5cuVKcHAwbUE95PSOyE5XTW5gDSNt8alITk5OiYMK1hBYu9Gp8oGoSFtQD9m8o/chttL1+tRBiL9x4wbtQg1k845RETMQul6fOhjYtRtdZfPu4+NDV+rvAVZktAs1+Bt5x6iAKQ1G/vv379N5ZYCxd7IQVyyY82HOQ2al9evXx/SfLqEtn4j3tWvXihNzGcHw4+/vj+lNQkICJqOtW7emS2gLY+9axxnq7TOsm1q1aiVNITwVoFMFSksvjTFjxqDXa/EGdYngwmkXaiCbdyw4L126RFdKJVjFDBgwAMv6WrVqkbn/rFmzqlatamJigiXPsGHDSDEIwpoeZWrUqOHs7EzeWx49evTQoUPRhZs1a4YjDBkyRFxGfZR27dqZm5vTqVqBxcSWLVtoF2ogm3csTzSdv3fq1Al+EWqx4MRaFykHDhzAgtPMzAwp27dvJ8V++OEHSMftjMU9FqV+fn5IdHBwqFy5MvT98ssv9vb26L+zZ8+WHrw458+fDwoKQnNiBRsdHU1nawUmkVgG0y7UQDbvRZqvVxs0aNC1a1dqdkHFGURkuJ46dSp5aW1t3a1bt3zBO8K0+M8QW1tbOzs7ca8Swb1FxtW+fftmZmbS2Vrh7u5OW1APOb3v2bOHvNOiJq6urrCAPosQKb41SHnfu3cvykCxtQCiUKNGjfIF77hdxGIIRJiufPQzOQgLGzdurFevnoWFRdn/A3XhwgXtgkyRvN4LCwvnzJlD104lmzZtatOmDcx+//33JIXyHhsbS3L9PxAcHJxfzPu4ceNQrMS3aIozd+5cFN69ezedoSHo7K9fv6YtqIec3gFWJZs3b6YrqBL0dIyQ6K3k3od30qMJWIiXK1fO0dHxzx0EKO8YKuvUqSPJV8WyZcvgHU1OZ2gChiK0HH39aiOzd7B06VJ13qjB5G/8+PFRUVG4W3v37o17n7xxiE4EKTt27MjJySElnZycyD+ekpKSDh48iLExX/BesWJFFL548SL6r7GxMfmfVGlguoUwiFPExcVhCoQx+dq1a3QhtcnKykKQpK9cE+T3/u7dO0wtPjpwwXuLFi0wZsIyAje8kHS0GaY0SIRZkoIGwJQGZpEI1z179swXvFtZWbVv3x6JuCEwj1S9+h8+fDgZVAHaGHGZLqE2jx49wswK9aevXBPk9w5evHgxY8aMj45yALIw1tGpwj+gKY+5ubmYCIrvvItxBrurcyJw8+bNw4cPIxIWf/tefRAVFyxYgEPR16whOvEOUEV0CvL/T11AxXcCxlWbklBzvP0o6OkIL+gT9NVqjq68FwkfAHZzczt69ChdfTlAo06bNo1KREcOLomydHARNB6W04if9HVqhQ69ExBJV65cqd0Hx5QD1iVYFT579oy+PG3RuXeAGxMj7W+//UZfjSHw4MEDzNC0Xh+Vhj68gz/++AMzloULF2JEoq9MwezatQtTVcw+6espM3ryTsCVrFq1ysvLKy0tjb5EhYFp/rx583CP0tcgE3r1Tnj+/HlgYCD6EflgnqJAVAkJCcFMUde/Y8PAO6GwsDAhIQFXiDtAxu9maA06AW5EHx8f7T6XoSnMvIvk5eVt2rRp0aJFy5cvP378eFk+s6gp6N1oe/I9/AMHDsj+JSYVsPcuAhHx8fHe3t4eHh5+fn6JiYlZWVm0qjJz+/btPXv2YIri6em5YsUKRHB96hZRkHcp6PWYMmMYIJ0RjrCNsS4lJSU9PZ12WQoYvZOTk2NjY1evXo0jeAmsX7/+3LlzWr9/KxcK9U6BaShiwqlTp7Zv345xj/z2CfFYHJILwsLCdu7cST4MTB+RNYbh/aOY8t9lZgL3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3NnDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3NnDvbODe2cC9s4F7ZwP3zgbunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBu6dDdw7G7h3PZGeni59SXmnchWIoXoPCgo6efKk+FLqHenIFV8qE0P1npeX17JlS1G96H3Pnj2tW7dG7p9FFYmhegcDBw5s1KgRUU+8b9261crKysXFhS6qPAzY+/nz56G7WbNmUI8NSDc3NzczM0tLS6OLKg8D9g46derUsGHDFi1awDuMd+7c2cnJiS6kSAzb+44dO6Ab0QZ/ob5Lly66fl6tXBi2d/Dll1+aCvTp06dnz550tlIxeO9Lliwh3vv27RsREUFnKxWD915QUIA5TLt27WxtbbFNZysVg/cOJk+ejNF1xYoVdIaCMWzv6enpq1evXrhwYePGjRctWoRt5b9DQDBU7zk5ORAdFhaWnZ2dn59/6NChZ8+ePXjwALN4Dw8P5NI7KAyD9J6SkoI+npubSz9RW+DJkyeLFy/GqoreTUkYnnf05QULFtCy/8rz58+hXsm93vC8u7m5ldbTpaDXIxDROysGA/N+/fr10NBQ2nEphIeHK/a9GgPz7u/vn5WVRQsuBQyzgYGB9CGUgYF59/Lyou2WDqL8smXL6EMoAwPzjtGStqsS7l0euHc2rFy5Uv34jnkkj+/ycPnyZfXnM1u2bOHzGXn4448/XF1d1Zm/owzWtPT+isHAvIPMzEwsnWjNxYB0vl6VmdOnT6tYtSJ9wYIF/P0ZnXD79u358+dv3LhROsxiGymQruSeTjBU70VCrL969aqfn5+XgLe3N2Y7qampdDlFYsDeDRrunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2GJ73sLCwuXPn0qmGhgF4/+OPP6QvBw0aZG1tLU0RoUpKUZHFBEV7v3DhwpAhQ6pWrVq7dm1PT88i4UN61apVMzExad269ahRo0ixgoKCGTNmWFpaIv0f//jHgQMHSPr48eNHjhwZHBzcvHlzHGT48OHPnj0TD84WRXvv0qUL/O7ZsyckJCQ2NhYpv/32W/v27c3NzZGyb98+UmzChAnGxsajR4/esGFDu3btypUrd/r0aaT37t27SpUqFhYWc+bM6dWrl5GRkbu7u+TwLFG0d1NTU3t7+5cvX0oTqThz//798uXL47YgLx89egTvKFMkeDczM7tz5w7Jwq3QuXNncUe2KNq7h4cHOik67KpVq96/f08SKe9HjhxBmZUrV4opyP3yyy+LBO+4Y8T0yZMnV6hQ4enTp2IKQxTtHURHRyN0wOyIESNICuU9MTERuQjiYkrHjh0bN25cVMz7lClTUPLJkydiCkOU7h2gp2N4RFdFDMHLwYMHN2nSRMzNyMiAzTFjxpCXL168QKz/17/+VVTMe4cOHerWrSu+ZItyvWPm5+zsHBcXd/PmTUdHx/r168NpkfCRYIiOj49//vw5KdmvX7+aNWsGBAScO3du2LBhyI2JiSkSvFesWBHlb926tXDhQrTHvHnzpKdgiKK9t2rVCmMmPLZt23b37t0kPTMzE1MaJEIrScHQ+vXXX2M4RSJmmeIXKlEAAQdhB+nIxTzy1atXJIs5yvVOwGQmOzubTi0qunv3LjXPwdwcTSIOv0WSOIMjKGQ4FVG697JAxXdF8Sl7nz9/PtaxdKoy+JS9KxnunQ3cOxu4dzZw72zg3tnAvbOBe2cD984G7p0N3DsbuHc2cO9s4N7ZwL2zgXtnA/fOBjbeb926RT6UIfLu3Tv1f8lBo8K6oOwVYON9x44dFy5ckKa8ePHC19dXmqICjQrrAhUV2LdvX1RUFNn28/Mr7WNS3Ls2lFaBGzduLF++XPT++PFj6ecbpBi9fPkyKCjo+PHjK1eu3Lt3L/lwxLlz5wICApBy6NChIuGj/iQsxMTEkOfHXL9+nTzR4dSpUyiGM5FH95CjHTlyBLsXz01KSsLLnTt3hoSElOhdWo1t27bdvHmzSPi82MaNG8mHlqSF37x5Ex0djfKbNm3CFRZ9OPuZM2dWrVqFk5JrRoVRBi2NlKtXr5aYIq02ddgS/ZAKUCfCjmvXrk1OTha9o9r5+fkfav0XjHCIJUuW4JS5ubmbN28+ffr069evV6xYkZWVBVmBgYH379+HbhyuoKBg6dKlW7ZsKRIek5Samvrq1St/f//nz59D6P79+4uECuFoiYmJz549o3LJYe/du5ednY0rKe6dqga2cRZkpaWloQ2owrhsBNmMjIzCwsLdu3eT3kAOgtqSmmdmZkLTsmXLcMacnBxy0uIp4o6k2tRhi1esxBMVCREG5eFNrTgjvWXQgGjqK1euELlFwrHQ1CkpKThHenp6XFwc3KFh0S/QDJcuXVq9enVCQsL27dvJJ0NxNB8fH/LlCioXt8jWrVvJYVXHGVKNhw8f4p59+/Yt7o+LFy+WWBgS0fzh4eHkuwbk7FCG7cjISFwI6kCdtHiKuKP4nRDpYYtXTCwvPRFuzTVr1qCP4viwR7q5Bt7RyLAsPigDXQChBrcb7jJsk9ogwpDTo9IQmiZAYoL0aFQuegrZq0gN7+RTebhPEfFwatgvXhh9FlkogNtf9C4eBJ0OOnCbosIkhZy0eAq1I3XYEitW/ERnz54NFcA9hK7566+/Fn3UO5oOtz+CFDompCMyYAeko19D3N27d1EOdxPp6SdOnEC0Qe2RiNCBe5bEbtyeRX+tEJWL+xrREDcyOjLiT3HvVDWKhOEB5xK/1yEt7CsMBrgL0eliY2NxV4nppAzRgcvGTXPt2jV4RBZOWjyF2pE6bIkVK34isl0kDK3qxhmEql27diEmoH+RT24ePHgQljFKoN3I3RcfH0+6yZ07d1BeHC4Q0aBm/fr1GCqL/lohKhfHQQ/CNaMtESiLe0cWVQ2cBecSv7AhLYyzPHjwYJUABOEK0U9L1HH58mWMkKg/BonSUqQ7UoeFx+J+SjwRQeodDlV5J4dAX5Zm4NYm8eujoBi6Np36ASpXxSNnSJa0Guhlqp8siT5I7jOq8lLIx7Vxn+Hmw61WYgqF9LCl+VENjoDLQU8ixynO/88jyZxPgSC8Yi5Ep2oCWn3dunW4cTEVRmApMUU12vnByIFTHDt2jM74AJt1k54p/uXV4imyo/oUfwvvCoR7ZwP3zgbunQ3cOxu4dzb8HyzE0H6bIkZzAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "var representation = workflow.getGraph( GraphRepresentation.Type.PLANTUML, \"sub graph\", false );\n",
    "\n",
    "displayDiagram( representation );"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Java (rjk 2.2.0)",
   "language": "java",
   "name": "rapaio-jupyter-kernel"
  },
  "language_info": {
   "codemirror_mode": "java",
   "file_extension": ".jshell",
   "mimetype": "text/x-java-source",
   "name": "java",
   "nbconvert_exporter": "script",
   "pygments_lexer": "java",
   "version": "17.0.2+8-86"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
